import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
import matplotlib
import os

project_list=[
        'TCGA-BLCA',
        'TCGA-BRCA',
        'TCGA-LGG',
        'TCGA-LUAD',
        'TCGA-LUSC',
    ]

# distance_list = ['pearson_distance','euclidean_distance','mahalanobis_distance_raw','cosine_distance','geodesic_distance','wasserstein_distance']
distance_list = ['pearson_distance','euclidean_distance','cosine_distance','geodesic_distance','wasserstein_distance']
# distance_list = ['pearson_distance','euclidean_distance','cosine_distance','geodesic_distance','wasserstein_distance']

type_list = ['raw','tsne','pca']

color_list = ['ro-','bo-','co-']

distance_list_cn = ['皮尔逊相关系数','欧氏距离','余弦距离','测地距离','推土机距离']
# distance_list_cn = ['皮尔逊相关系数','欧氏距离','余弦距离','测地距离','推土机距离']

''' 绘图设置''' 
# 指定支持中文的字体，例如使用微软雅黑
matplotlib.rcParams['font.family'] = 'Microsoft YaHei'
# 可以设置更多字体参数，例如字体大小
matplotlib.rcParams['font.size'] = 12
# myfont = FontProperties( size=12)    # 创建字体对象


# 使用ggplot的绘图风格，可以通过plt.style.available查看可选值
plt.style.use('ggplot')

for k,project in enumerate(project_list):
    fig=plt.figure(figsize=(20,10),dpi=100)
    for i,distance_mat in enumerate(distance_list):
        # print(distance_mat)
        values = []
        
        #设置选取的数据的维度
        for j,type in enumerate(type_list):
            file_dir  = f'distance-matrix\\{project}\\{distance_mat}_{type}.tsv'
            # print(file_dir)
            df = pd.read_csv(file_dir,index_col=0,header=0)
            # print(df)
            # exit()
            values.append(df.iloc[0:10,0])
        # print(values)
        # print(len(values[0]))
        #设置雷达图的角度
        angles=np.linspace(0, 2*np.pi, 10, endpoint=False)
        angles=np.concatenate((angles,[angles[0]])) # 角度闭合
        # 设置刻度线标签
        if i == 0:
            feature1 = ['','Obj1','Obj2','Obj3','Obj4','Obj5','Obj6','Obj7','Obj8','Obj9','Obj10']
        else:
            feature1 = []
        feature2 = []
        # 参数polar, 以极坐标的形式绘制图形
        ax1 = fig.add_subplot(2, 5, i+1, polar=True)
        ax2 = fig.add_subplot(2, 5, i+6, polar=True)
        # ax1.figure
        # print(i)
        # break
        # continue

        # 画降维前和PCA降维后的雷达图
        for idx,value in enumerate([values[0], values[1]]):
            # print(idx)
            # 拼接数据首尾，使图形中线条封闭
            value=np.concatenate((value,[value[0]]))
            # 绘制折线图
            ax1.plot(angles, value, '{}'.format(color_list[idx]), linewidth=2, label='{}'.format(type_list[idx]))
            # 设置绘图区四个边框线上的刻度线标签是否显示 
            ax1.tick_params(labelleft=False, labelbottom=True, colors='purple') 
            # 填充颜色
            ax1.fill(angles, value, alpha=0.25)
            # 不显示数据标签
            ax1.set_yticks([])
            # 图例设置
            ax1.legend(loc=(1,1))
            # 设置图标上的角度划分刻度，为每个数据点处添加标签
            ax1.set_thetagrids(angles * 180/np.pi, feature1)
            # 设置子图标题
            ax1.set_title(distance_list_cn[i], x=0.5, y=1.18,)

        # 画降维前和tSNE降维后的雷达图
        for idx,value in enumerate([values[0], values[2]]):
            # 拼接数据首尾，使图形中线条封闭
            value=np.concatenate((value,[value[0]]))
            # 绘制折线图
            ax2.plot(angles, value, '{}'.format(color_list[idx*2]), linewidth=2, label='{}'.format(type_list[idx*2]))
            # 设置绘图区四个边框线上的刻度线标签是否显示 
            ax2.tick_params(labelleft=False, labelbottom=True)  
            # 填充颜色
            ax2.fill(angles, value, alpha=0.25)
            # 不显示数据标签
            ax2.set_yticks([])
            # 图例设置
            ax2.legend(loc=(1,1))
            # 设置图标上的角度划分刻度，为每个数据点处添加标签
            ax2.set_thetagrids(angles * 180/np.pi, feature2)
            # 设置子图标题
            ax2.set_title(distance_list_cn[i], x=0.5, y=1.18,)

    # 添加标题
    plt.suptitle(f'距离雷达图 -- {project}')
    # 调整子图布局
    # plt.subplots_adjust(hspace=0.2,wspace=0.4)
    # plt.tight_layout(pad = 0.5)
    # 添加网格线
    ax1.grid(True)
    # ax2.grid(True)
    filename = f'距离雷达图 -- {project}'
    output_folder = 'radar-map'
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)
    plt.savefig(os.path.join(output_folder, filename))
    plt.show()